package model;

import java.io.File;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NhanVien {
//attribute:
	private String cmnd;
	private String hoTen;
	private String ntns;
	private String diaChi;
	private String gioiTinh;
	private String email;
	private String soDienThoai;
	private double luong;
	private double qshnv;
	
	Scanner s;
	
//constructor:
	public NhanVien() {
		setSCMND(cmnd);
		setHoTen(hoTen);
		setNtns(ntns);
		setDiaChi(diaChi);
		setGioiTinh(gioiTinh);
		setEmail(email);
		setSoDienThoai(soDienThoai);
		setLuong(luong);
	}
	
	//nhap thong tin nhan vien
	public void nhapThongTin() {
		String cmRegex = "[0-9]{9}";
		String htRegex = "[^!@#$%^&*()-=+?.>,<`~}{\\[\\]\\|\\\\'\";:]+";
		String nsRegex = "(0[1-9]|[1-9]|[1-2][0-9]|3[0-1])[/-](0[1-9]|[1-9]|1[1-2])[/-]19[0-9]{2}";
		String dcRegex = "[^!@#$%^&*()=+?><`~]+";
		String gtRegex = "[nN][aA][mM]|[nN][uUữỮ]|[kK][hH][aAáÁ][cC]";
		String emailRegex = "[a-zA-Z][\\w]+(@)[\\w]+((.)[\\w]+)+";
		String dtRegex = "[0-9]{10,11}";

		
		//nhập số chứng minh nhân dân
		do {
			s = new Scanner(System.in);
			System.out.print("\tCMND: ");
			cmnd = s.nextLine();
			if(cmnd.trim().isEmpty()) {
				System.err.println("\tVui lòng không bỏ trống.");
			}
			else if(checkInput(cmnd, cmRegex) == false) {
				System.err.println("\tSố CMND không hợp lệ. Vui lòng kiểm tra lại.");
			}
		} while(checkInput(cmnd, cmRegex) == false);
			
		//nhập họ tên
		do {
			s = new Scanner(System.in);
			System.out.print("\tHọ tên: ");
			hoTen = s.nextLine();
			if(hoTen.trim().isEmpty()) {
				System.err.println("\tVui lòng nhập họ tên");
			}
			else if(checkInput(hoTen, htRegex) == false) {
				System.err.println("\tHọ tên không hợp lệ. Vui lòng kiểm tra lại.");
			}
		} while(checkInput(hoTen, htRegex) == false);
			
		//nhập ngày tháng năm sinh
		do {
			s = new Scanner(System.in);
				
			System.out.print("\tNgày/tháng/năm sinh: ");
			ntns = s.nextLine();
			
			if(ntns.trim().isEmpty()) {
				System.err.println("\tVui lòng nhập ngày tháng năm sinh.");
			}
			else if(checkInput(ntns.replace(" ", ""), nsRegex) == false || checkDate(ntns) == false) {
				System.err.println("\tNgày tháng năm sinh không hợp lệ. Vui lòng kiểm tra lại: ");
			}
		} while((checkInput(ntns, nsRegex) == false) || (checkDate(ntns) == false));
			
		//nhập địa chỉ
		do {
			s = new Scanner(System.in);
			System.out.print("\tĐịa chỉ: ");
			diaChi = s.nextLine();
			if(diaChi.trim().isEmpty()) {
				System.err.println("\tVui lòng nhập địa chỉ.");
			}
			else if(checkInput(diaChi, dcRegex) == false) {
				System.err.println("\tĐịa chỉ không hợp lệ. Vui lòng kiểm tra lại.");
			}
		} while(checkInput(diaChi, dcRegex) == false);
		
		//nhập giới tính
		do {
			s = new Scanner(System.in);
			System.out.print("\tGiới tính: ");
			gioiTinh = s.nextLine();
			if(gioiTinh.trim().isEmpty()) {
				System.err.print("\tVui lòng nhập giới tính.");
			}
			else if(checkInput(gioiTinh, gtRegex) == false) {
				System.err.println("\tGiới tính không hợp lệ. Vui lòng nhập lại.");
			}
			
		} while(checkInput(gioiTinh, gtRegex) == false);
		
		//nhập email
		do {
			s = new Scanner(System.in);
			System.out.print("\tEmail: ");
			email = s.nextLine();
			if(email.trim().isEmpty()) {
				System.err.println("\tVui lòng nhập Email.");
			}
			else if(checkInput(email, emailRegex) == false) {
				System.err.println("\tEmail không hợp lệ. Vui lòng kiểm tra lại.");
			}
		} while(checkInput(email, emailRegex) == false);
		
		//nhập số điện thoại
		do {
			s = new Scanner(System.in);
			System.out.print("\tĐiện thoại: ");
			soDienThoai = s.nextLine();
			if(soDienThoai.trim().isEmpty()) {
				System.err.println("\tVui lòng nhập số điện thoại.");
			}
			else if(checkPhoneNumber(soDienThoai) == false) {
				System.err.println("\tSố điện thoại không hợp lệ. Vui lòng nhập lại.");
			}
		} while(checkPhoneNumber(soDienThoai) == false);
		
		//nhập lương
		do {
			s = new Scanner(System.in);
			System.out.print("\tLương: ");
			luong = s.nextDouble();
			
			if(luong < 0) {
				System.err.println("\tLương không hợp lệ. Vui lòng kiểm tra lại.");
			}
		} while(luong < 0);
		
		System.out.println("\tQuy sinh hoat: " + tinhQSHNV() + "$");
		System.out.println();
	}
	
	
	
	//tính quỹ sinh hoạt hàng tháng của nhân viên
	public double tinhQSHNV() {
		double q;
		if(luong <= 200) {
			q = 0;
		}
		else if(luong <= 400) {
			q = luong * 0.01;
		}
		else if(luong <= 600) {
			q = luong * (0.02);
		}
		else {
			q = luong * (0.03);
		}
		
		return q;
	}
	
//Cac ham validate du lieu rieng

	//ham kiem tra so dien thoai
	public boolean checkPhoneNumber(String phoneNum) {
		boolean check = false;
		
		String numRegexMobi = "([\\+]?84|0)(((90|93|)[0-9]{7})|((120|121|124|122|126|128)[0-9]{6}))";
		String numRegexViettel = "([\\+]?84|0)((97|98[0-9]{7})|(1636|1637|1638|1639|164|165|166|167|168|169)[0-9]{7})";
		String numRegexVina = "([\\+]?84|0)(91|94|123|125|127|129)[0-9]{7}";
		String numRegexEVN = "([\\+]?84|0)96[0-9]{7}";
		String numRegexSFone = "([\\+]?84|0)95[0-9]{7}|155[0-9]{6}";
		String numRegexVNMB = "([\\+]?84|0)92[0-9]{7}|188[0-9]{6}";
		String numRegexBeline = "([\\+]?84|0)199[0-9]{6}";
		
		Pattern p1 = Pattern.compile(numRegexMobi);
		Pattern p2 = Pattern.compile(numRegexViettel);
		Pattern p3 = Pattern.compile(numRegexVina);
		Pattern p4 = Pattern.compile(numRegexEVN);
		Pattern p5 = Pattern.compile(numRegexSFone);
		Pattern p6 = Pattern.compile(numRegexVNMB);
		Pattern p7 = Pattern.compile(numRegexBeline);
		
		Matcher m1 = p1.matcher(phoneNum);
		Matcher m2 = p2.matcher(phoneNum);
		Matcher m3 = p3.matcher(phoneNum);
		Matcher m4 = p4.matcher(phoneNum);
		Matcher m5 = p5.matcher(phoneNum);
		Matcher m6 = p6.matcher(phoneNum);
		Matcher m7 = p7.matcher(phoneNum);
		
		if(m1.matches() || m2.matches() || m3.matches() || m4.matches() || m5.matches() || m6.matches() || m7.matches()) {
			check = true;
		}
		else {
			check = false;
		}
		return check;
	}
	
	//ham kiem tra du lieu nhap vao co phu hop voi bieu thuc chinh quy hay khong
	public boolean checkInput(String input, String inputRegex) {		
		Pattern p = Pattern.compile(inputRegex);
		Matcher m = p.matcher(input);
		
		if((m.matches() == false)) {
			return false;
		}
		return true;
	}
	
	//ham kiem tra ngay thang nam sinh
	public boolean checkDate(String ns) {
		String[] date = ns.split("/");
		int ngay = 0;
		int thang = 0;
		int nam = 0;
		for(int i = 0; i < ns.length(); i++) {
			ngay = Integer.parseInt(date[0]);
			thang = Integer.parseInt(date[1]);
			nam = Integer.parseInt(date[2]);
		}
		switch (thang) {
			case 2: {
				if(nam % 4 == 0 || (nam % 400 == 0 && nam % 100 != 0)) {
					if(ngay > 29) {
						return false;
					}
				}
				else {
					if(ngay > 28) {
						return false;
					}
				}
			}
			break;
			
			case 4:
			case 6:
			case 9:
			case 11: {
				if(ngay > 30) {
					return false;
				}
			}
			break;
			
			default: {
				return true;
			}
		}
		return true;
	}
	
	//ham loai bo ky tu dac biet
	public String cancelSpecialCharacter(String str) {
		char[] specialCharacter = { '`', '~', '!', '@', '#', '$', '%', '^', '&',
									'*', '(', ')', '-', '_', '+', '=', '|', ']',
									'[', '{', '}', '\'', '"', '?', '>', '<'
								  	};
		return str;
	}
		
//settors and gettors:
	public String getSCMND() {
		return cmnd;
	}

	public void setSCMND(String sCMND) {
		cmnd = sCMND;
	}

	public String getHoTen() {
		return hoTen;
	}

	public void setHoTen(String hoTen) {
		this.hoTen = hoTen;
	}

	public String getNtns() {
		return ntns;
	}

	public void setNtns(String ntns) {
		this.ntns = ntns;
	}

	public String getDiaChi() {
		return diaChi;
	}

	public void setDiaChi(String diaChi) {
		this.diaChi = diaChi;
	}

	public String getGioiTinh() {
		return gioiTinh;
	}

	public void setGioiTinh(String gioiTinh) {
		this.gioiTinh = gioiTinh;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSoDienThoai() {
		return soDienThoai;
	}

	public void setSoDienThoai(String soDienThoai) {
		this.soDienThoai = soDienThoai;
	}

	public double getLuong() {
		return luong;
	}

	public void setLuong(double luong) {
		this.luong = luong;
	}

	public double getQshnv() {
		return qshnv;
	}

	public void setQshnv(double qshnv) {
		this.qshnv = qshnv;
	}
}